package com.xuetang9.fujian.donamicproxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author: fujian
 * @description:
 * cglib代理与jdk代理的区别
 * 1、jdk动态代理生成的代理类和委托类实现相同的接口
 * 2、cglib动态代理使用了更加复杂的字节码生成技术，生成的代理类是委托类的字类-不能处理final方法
 * 3、jdk采用可反射机制调用委托类的方法，cglib采用类似索引的方法直接调用委托类的方法
 * @date: 2021/5/2 8:01
 * @version: V1.0
 * @package: com.xuetang9.fujian.donamicproxy
 **/
public class CglibDemo {
    // 私有的不能被代理
    // 默认，protected 都能被代理
    public void test(){
        System.out.println("普通的测试方法");
    }

    public static void main(String[] args) {
        // Enhancer：和jdk中的proxy差不多，区别在于Enhancer既能代理普通类，又能代理接口
        Enhancer enhancer = new Enhancer();
        // 设置需要代理的类
        enhancer.setSuperclass(CglibDemo.class);
        // 设置回调
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println(method.getName()+"方法调用前");
                methodProxy.invokeSuper(o, objects);
                System.out.println(method.getName()+"方法调用后");
                return null;
            }
        });

        CglibDemo cglibDemo = (CglibDemo) enhancer.create();
        cglibDemo.test();

    }

}

